/*
 *  Copyright (C) 2010 Fabien Renaud
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.boc.botv.service;

import com.boc.botv.model.User;
import java.util.Date;
import java.util.List;

/**
 * Représente un gestionnaire d'utilisateurs
 * @author Fabien Renaud
 */
public interface UserManager {

  /**
   * Vérifie si un pseudo existe déjà
   * @param login Le pseudo à rechercher
   * @return true si le pseudo existe déjà, false sinon
   */
  public boolean loginExists(String login);

  /**
   * Vérifie si une adresse courriel est déjà utilisée
   * @param mail L'adresse courriel à rechercher
   * @return true si l'adresse courriel existe déjà, false sinon
   */
  public boolean mailExists(String mail);

  /**
   * Obtient un utilisateur selon un id
   * @param userId L'Id de l'utilisateur à rechercher
   * @return L'unique utilisateur trouvé, null sinon
   */
  public User getUser(int userId);

  /**
   * Obtient un utilisateur selon un pseudo
   * @param login Le pseudo de l'utilisateur à rechercher
   * @return L'unique utilisateur trouvé, null sinon
   */
  public User getUser(String login);

  /**
   * Obtient tous les utilisateurs existants
   * @return Tous les utilisateurs existants
   */
  public List<User> getUsers();

  /**
   * Génère un mot de passe aléatoire et l'envoie par mail.
   * Le mot de passe est crypté.
   * @param login Pseudo de l'utilisateur pour lequel il faut regénérer le mot de passe.
   */
  public void regeneratePassword(String login);

  /**
   * Crée un nouvel utilisateur
   * @param user L'utilisateur à créer
   */
  public boolean saveUser(User user);

  /**
   * Met à jour les informations d'un compte utilisateur.
   * @param user Utilisateur contenant les informations modifiées.
   */
  public boolean updateUser(User user);

  /**
   * Supprime définitivement un utilisateur
   * @param user L'utilisateur à supprimer
   */
  public void deleteUser(User user);

  /**
   * Crée une session pour un utilisateur en fonction de ses identifiants.
   * @param login Login de l'utilisateur
   * @param password Password de l'utilisateur
   * @return true si la session a bien été créé
   */
  public boolean loqIn(String login, String password);

  /**
   * Vérifie si le mot de passe d'un utilisateur est correct
   * @param login Le pseudo de l'utilisateur
   * @param password Le mot de passe de l'utilisateur
   * @return true si le mot de passe est correct
   */
  public boolean checkPassword(String login, String password);

  /**
   * Encrypte du texte selon l'encryptage d'un mot de passe utilisateur
   * @param password Le texte à crypter
   * @return Le texte crypté
   */
  public String encryptPassword(String password);

  /**
   * Ajoute une méthode de paiement à un utilisateur
   * @param userId L'id de l'utilisateur
   * @param ownerName Le nom du propriétaire de la carte
   * @param cardNumber Le numéro de la carte
   * @param cardName Nom de la carte (ex: Visa, Mastercard, etc)
   * @param cardExpirationDate La date d'expiration de la carte
   * @param cardCryptogram Le cryptogramme de la carte
   * @return true si la méthode de paiement a été correctement ajoutée
   */
  public boolean addPaymentMethod(int userId, String ownerName, String cardNumber, String cardName, Date cardExpirationDate, String cardCryptogram);

  /**
   * Supprime un compte bancaire utilisateur
   * @param userId L'id de l'utilisateur dont il faut supprimer le cpmte bancaire
   * @return true si le compte a été supprimé
   */
  public boolean deletePaymentMethod(int userId);
}
